package com.myspring.aop.eg.example;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ProxyFactory {


    //目标对象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    //返回代理对象
    public Object getProxy() {
        /**
         * Proxy.newProxyInstance()方法
         * 参数1：ClassLoader类加载器
         * 参数2：目标对象实现的所有接口的class类型数组
         * 参数3：InvocationHandler接口的实现类，用于处理代理对象的方法调用
         */

        //获取目标对象的类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();

        //获取目标对象实现的接口
        Class<?>[] interfaces = target.getClass().getInterfaces();

        //InvocationHandler接口的实现类，用于处理代理对象的方法调用
        InvocationHandler invocationHandler = new InvocationHandler() {
            //1 代理对象
            //2 需要重写目标对象的方法
            //3 method方法参数
            @Override
            public Object invoke(Object proxy,
                                 Method method,
                                 Object[] args) throws Throwable {
                System.out.println("[动态代理][日志] "+method.getName()+"，参数："+ Arrays.toString(args));
                Object result = method.invoke(target, args);
                System.out.println("[动态代理][日志] "+method.getName()+"，结果："+ result);
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}
